package bluetooth;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import ota.MyByte;
import ota.OtaUtils;

public class BluetoothCheckSendDataUtils {
	private byte[] otaByteData;
	private List<Byte> notificationDataListNeedSend;
	private int MAX_VALUS;//表示最大发送的字节数
	private byte[] beforeFiveByte,beforeThreeByte;// 报文首五个字节,报文首三个字节
	 private int currentNo;//表示当前 子包的编号

	private volatile static BluetoothCheckSendDataUtils mCheckSendDataUtils;

	private BluetoothCheckSendDataUtils() {
	}

	public static BluetoothCheckSendDataUtils getCheckSendDataUtilsInstance() {
		if (mCheckSendDataUtils == null) {
			synchronized (OtaUtils.class) {
				if (mCheckSendDataUtils == null) {
					mCheckSendDataUtils = new BluetoothCheckSendDataUtils();
				}
			}
		}
		return mCheckSendDataUtils;
	}

	/**
	 * 初始化数据
	 */


	public void initCheckSendDataUtils(byte[] otaDataByte, int maxValus) {
		currentNo=0;
		this.MAX_VALUS = maxValus;
		otaByteData = otaDataByte;
		beforeThreeByte=new byte[3];
		notificationDataListNeedSend = new ArrayList<Byte>();// 全部数据
		for (int i = 0; i < otaByteData.length; i++) {
			notificationDataListNeedSend.add(otaByteData[i]);
		}
	}

	/**
	 * 该方法是用于发送下载下来的ota文件用的
	 * 
	 * 对数据进行解析 boolean isOnlyNeedOneSend 是否只需要一包就可以发送 byte[] beforeThreeByte
	 * 报文首三个字节
	 * 
	 */

	private byte[] checkData(boolean isOnlyNeedOneSend) {
		if (isOnlyNeedOneSend) {// 只需要一包

			List<Byte> listByteNeedSend = new ArrayList<Byte>();// 需要发送的字节

			for (int i = 0; i < beforeThreeByte.length; i++) {
				listByteNeedSend.add(beforeThreeByte[i]);
			}

			while (true) {
				listByteNeedSend.add(notificationDataListNeedSend.get(0));
				notificationDataListNeedSend.remove(0);
				if (notificationDataListNeedSend == null || notificationDataListNeedSend.size() <= 0) {
					break;
				}

			}

			byte[] needSendByte = new byte[listByteNeedSend.size()];

			for (int i = 0; i < listByteNeedSend.size(); i++) {
				needSendByte[i] = listByteNeedSend.get(i);
			}
			return needSendByte;
		} else {// 需要多包

			List<Byte> listByteNeedSend = new ArrayList<Byte>();// 需要发送的字节
			for (int i = 0; i < beforeThreeByte.length; i++) {
				listByteNeedSend.add(beforeThreeByte[i]);
			}

			int currentDataIndex = 0;
			while (true) {
				byte currentByte=notificationDataListNeedSend.get(0);
				listByteNeedSend.add(currentByte);
				notificationDataListNeedSend.remove(0);
				currentDataIndex++;

				if (currentDataIndex >= MAX_VALUS-3) {
					break;
				}

			}

			byte[] needSendByte = new byte[listByteNeedSend.size()];

			for (int i = 0; i < listByteNeedSend.size(); i++) {
				needSendByte[i] = listByteNeedSend.get(i);
			}
			return needSendByte;

		}
	}

	/**
	 * 判断当前数据是否满足mtu值
	 */
	//	final byte[] ENABLE_NOTIFICATION_MIX_VALUE2 = new byte[] { 0x14, (byte) 0x36,  0x00, 0x03, (byte) 0x0f,
//			(byte)0x0a, (byte)0x5c ,
//			(byte)0x0a, (byte)0x5c ,
//			(byte)0x0a, (byte)0x5c ,
//			(byte)0x0a, (byte)0x5c ,
//			(byte)0x0a, (byte)0x5c ,
//
//			(byte)0x0a, (byte)0x5c ,
//			(byte)0x0a, (byte)0x5c ,
//
//	};
	public byte[] checkDataIsSatisfyMtuValus() {
		currentNo++;
        if(notificationDataListNeedSend==null||notificationDataListNeedSend.size()<=0){
        	return null;
        }



		int otaListNeedSendSize = notificationDataListNeedSend.size();
		if (otaListNeedSendSize <= MAX_VALUS-3) {// 表示一包就可以发送

			//总长度
			byte[] allLength=MyByte.intToByteArray(notificationDataListNeedSend.size()+3);
			beforeThreeByte[0]= allLength[allLength.length-1];

			//指令头
			byte[] dataByte=MyByte.intToByteArray(notificationDataListNeedSend.size());
			beforeThreeByte[1]= (byte)0x36;

			//当前是第几包
			byte[] currentNoByte=MyByte.intToByteArray(currentNo);
			beforeThreeByte[2]= currentNoByte[currentNoByte.length-1];



			return checkData(true);
		} else if (otaListNeedSendSize > MAX_VALUS-3) {// 必须分包才可以发送

			//总长度
			byte[] allLength=MyByte.intToByteArray(MAX_VALUS);
			beforeThreeByte[0]= allLength[allLength.length-1];

			//指令头
			byte[] dataByte=MyByte.intToByteArray(notificationDataListNeedSend.size());
			beforeThreeByte[1]= (byte)0x36;

			//当前是第几包
			byte[] currentNoByte=MyByte.intToByteArray(currentNo);
			beforeThreeByte[2]= currentNoByte[currentNoByte.length-1];


			return checkData(false);
		}

		return null;

	}

	/**
	 * 该方法是用于发送第一包数据时候使用
	 * 
	 * 发送第一包数据 flagStyleInt 拆分包类型 flagCountsInt 数据包总共包数 flagVersionNoOld
	 * 差分升级包原软件版本号 flagVersionNoNew 差分升级包新软件版本号
	 * 
	 */
//	public byte[] firstFlagData(int flagStyleInt, int flagCountsInt, int flagVersionNoOldInt, int flagVersionNoNewInt) {
//		byte[] flagStyle = new byte[] { (byte) (flagStyleInt) };// 拆分包类型---1个字节
//		byte[] flagNo = intToByteArray(1);// 数据包编号---2个字节
//		byte[] flagCounts = intToByteArray(flagCountsInt);// 数据包总共包数---2个字节
//		byte[] flagVersionNoOld = intToByteArray(flagVersionNoOldInt);// 差分升级包原软件版本号---2个字节
//		byte[] flagVersionNoNew = intToByteArray(flagVersionNoNewInt);// 差分升级包新软件版本号---2个字节
//
//		byte[] needSendByte = new byte[9];
//		needSendByte[0] = flagStyle[0];
//
//		needSendByte[1] = flagNo[2];
//		needSendByte[2] = flagNo[3];
//
//		needSendByte[3] = flagCounts[2];
//		needSendByte[4] = flagCounts[3];
//
//		needSendByte[5] = flagVersionNoOld[2];
//		needSendByte[6] = flagVersionNoOld[3];
//
//		needSendByte[7] = flagVersionNoNew[2];
//		needSendByte[8] = flagVersionNoNew[3];
//
//		return needSendByte;
//
//	}


	public static byte[] intToByteArray(int i) {
		byte[] result = new byte[4];
		result[0] = (byte) ((i >> 24) & 0xFF);
		result[1] = (byte) ((i >> 16) & 0xFF);
		result[2] = (byte) ((i >> 8) & 0xFF);
		result[3] = (byte) (i & 0xFF);
		return result;
	}

}
